package jp.gr.java_conf.yuzu_project.parts;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import jp.gr.java_conf.yuzu_project.common.CommonUtil;
import jp.gr.java_conf.yuzu_project.common.ItemData;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import android.content.Context;
import android.content.res.AssetManager;
import android.util.Log;

/**
 * アイテムXMLパーサー
 * @author ゆずプロジェクト
 *
 */
public class ItemDataParse {

	Context mContext;
	private String ITEM_FILE_NAME = "xml/item.xml";
	
	/**
	 * コンストラクタ
	 */
	public ItemDataParse(Context context) {
		mContext = context;
	}
	
	/**
	 * アイテムデータを返す
	 * @return アイテムリスト
	 */
	public List<ItemData> getItemList() {
		List<ItemData> itemList = null;
		
		// AssetからXML読み込み
		String xmlString = readAssetXml();

		//　XML文字列をパース
		Document doc = parseXmlString(xmlString);
		
		// アイテムデータのリストを作成
		itemList = setItemData(doc);
		
		for (int i = 0; i < itemList.size(); i++) {
			Log.i("アイテムリスト", itemList.get(i).getItemNo() + " " + itemList.get(i).getItemName() + " " + itemList.get(i).getItemExplanation() + " " + itemList.get(i).getItemImage());
		}
		
		return itemList;
	}
	
	/**
	 * Assetからデータを取ってくる
	 * @return XMLデータ
	 */
	private String readAssetXml() {
		String retrnStr = "";
		AssetManager as = mContext.getResources().getAssets();
		InputStream is = null;
		 BufferedReader br = null;
		 StringBuilder sb = new StringBuilder();
 
		try {
			try {
				is = as.open(ITEM_FILE_NAME);
				br = new BufferedReader(new InputStreamReader(is));

				String str;
				while ((str = br.readLine()) != null) {
					sb.append(str + "\n");
				}
				retrnStr = sb.toString();
			} finally {
				if (br != null) br.close(); 
			}
			 
		} catch (IOException e) {
			retrnStr = CommonUtil.ERROR_001;
			e.printStackTrace();
		}
		
		return retrnStr;
	}
	
	/**
	 * XMLパーサー
	 * @param xml 取り込んだXMLデータの文字列
	 * @return XML解析ドキュメント
	 */
	private Document parseXmlString(String xml) {
		DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
		Document doc = null;
		try {
			DocumentBuilder docbuilder = dbfactory.newDocumentBuilder();
			doc = docbuilder.parse(new ByteArrayInputStream(xml.getBytes("UTF-8")));
		
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		}
		
		return doc;
	}
	
	/**
	 * アイテムデータリストを返す
	 * @param doc XML解析データ
	 * @return アイテムリスト
	 */
	private List<ItemData> setItemData(Document doc) {
		NodeList nl = doc.getElementsByTagName("Item");
		int length = nl.getLength();
		List<ItemData> itemList = new ArrayList<ItemData>();
		
		for (int i = 0; i < length; i++) {
			Element element = (Element)nl.item(i);
			ItemData item = new ItemData();
			item.setItemNo(getNodeValue(element, CommonUtil.ITEM_TAG_NO));
			item.setItemName(getNodeValue(element, CommonUtil.ITEM_TAG_NAME));
			item.setItemExplanation(getNodeValue(element, CommonUtil.ITEM_TAG_EXPLANATION));
			item.setItemImage(getNodeValue(element, CommonUtil.ITEM_TAG_FILEINMAGE));
			itemList.add(item);
			item = null;
		}
		
		return itemList;
	}
	
	/**
	 * ノード値を返す
	 * @param element 要素
	 * @param tagName タグ名
	 * @return 値
	 */
	private String getNodeValue(Element element, String tagName) {
		NodeList nl2 = element.getElementsByTagName(tagName);
		Node n = nl2.item(0);
		Node content = n.getFirstChild();
		Log.i("中身", content.getNodeValue());
		return content.getNodeValue();
	}
	
} 
